package shujia.day06;

/*
    在此之前，我们写的动物类，水果类，人类等等，这些类在实际生活中其实就是一个概念的集合
    而概念性的东西，在生活中是看不见摸不着的，这样的类，方法也不应该有具体的实现
    java针对这种现实场景，提供了一个关键字：abstract用于表示抽象的概念
    可以修饰类和方法

    abstract关键字使用注意事项：
        1、被abstract关键字修饰的类，称之为抽象类，抽象类无法实例化【不能创建对象】
        2、抽象类可以借助具有的子类【没有被abstract关键字修饰的类】来创建对象
        3、被abstract关键字修饰的方法，称之为抽象方法，抽象写法不能有大括号方法体
        4、当一个具体的子类继承一个抽象类的话，必须要重写抽象父类中所有的抽象方法
        5、抽象类中既可以存在具体实现的方法【有大括号的】，也可以存在抽象方法
        6、当一个抽象类继承一个抽象类的话，可以选择性的重写方法，也可以都不重写
        7、具体的类中不能存在抽象方法【有抽象方法的类一定是抽象类】
 */
//抽象类
abstract class Animal3{
//    public void fun1(){
//        System.out.println("好好学习，天天向上");
//    }

    // 抽象方法
    public abstract void eat();

    public abstract void sleep();
}

abstract class Demo2 extends Animal3{

}


class Dog3 extends Animal3{
//    public abstract void show1();

    @Override
    public void eat() {
        System.out.println("🐕吃🥩");
    }

    @Override
    public void sleep() {
        System.out.println("🐕侧着睡");
    }
}

public class AbstractDemo1 {
    public static void main(String[] args) {
//        Animal3 animal3 = new Animal3();

        Animal3 a1 = new Dog3(); // 抽象多态
//        a1.fun1();
        a1.eat();
        a1.sleep();


    }
}
